import { intoRecurse } from './common.js';
import { getTmpCache } from './cache.js';
import { resetRouter } from '@/router';
import router from '@/router';
import { isProduction, isDynamicPermission } from '@/setting.js';
import { removeTmpCache } from '@u/cache.js';
import translateIntoRouters from '@/router/addRoutes.js';

export function loginOut(vm) { // 退出登录调这个函数
  removeTmpCache('token'); // 清除 token 本地缓存
  removeTmpCache('isFoldSide'); // 清除 isFoldSide 本地缓存
  if (isProduction && isDynamicPermission) {
    vm.$store.commit('user/SET_PERMISSION', []); // 清除用户权限
  }
  vm.$store.commit('user/setModulesPermission', []); // 清除用户模块权限
  vm.$store.commit('user/setMenusPermission', []); // 清除用户菜单权限
  vm.$store.commit('user/setFunctionsPermission', []); // 清除用户功能权限
  vm.$store.commit('user/setButtonsPermission', {}); // 清除用户按钮权限
  vm.$store.commit('user/SET_USERINFO', {}); // 清除用户信息
  vm.$store.commit('layout/setSideMenuList', []); // 清除侧边栏菜单
  vm.$store.commit('layout/setAffixTagViews', []); // 清除 affixTagViews
  vm.$store.commit('layout/setTagViews', []); // 清除 tagViews
  vm.$store.commit('layout/clearAliveRoters'); // 清除页面缓存
  vm.$store.commit('layout/clearPages'); // 清除页面数据缓存
  vm.$store.commit('layout/clearScrollCache'); // 清除滚动条缓存
  vm.$message.success('退出成功！');
  vm.$router.push({
    name: 'Login',
  });
  resetRouter(); // 清除掉动态加载的路由
}

export async function handlePermissonChange(vm) { // 更改权限
  vm.$store.commit('layout/clearAliveRoters'); // 清除所有页面缓存
  const meta = vm.$route.meta, // 路由的 meta
    indexPage = { path: '404' }, // 初始化首页
    oldTagViews = vm.$store.getters.tagViews,
    newTagViews = [],
    userPermission = await vm.$store.dispatch('user/getUserPermission'), // 重新获取权限
    { asyncRouters, affixRouters, modules, menus, functions, buttons } = translateIntoRouters(userPermission, (buttons, item) => { // 将权限转换为二维路由
      let path = item.redirect.replace('?token', `?token=${ getTmpCache('token') }`); // 处理并获取按钮权限
      path = path.replace('&token', `&token=${ getTmpCache('token') }`);
      buttons[item.name] = {
        name: item.name,
        title: item.meta && item.meta.title,
        redirect: path
      };
    });
  vm.$store.commit('layout/setAffixTagViews', affixRouters); // 重新获取固定的 affixRouters
  vm.$store.commit('user/setModulesPermission', modules); // 重新获取模块权限
  vm.$store.commit('user/setMenusPermission', menus); // 重新获取菜单权限
  vm.$store.commit('user/setFunctionsPermission', functions); // 重新获取功能权限
  vm.$store.commit('user/setButtonsPermission', buttons); // 重新获取按钮权限
  if (meta && meta.module) { // 重新获取侧边栏
    const m = vm.$store.getters.userPermission.find(item => item.name == meta.module.name);
    if (m && m.children) {
      vm.$store.commit('layout/setSideMenuList', m.children);
    }
  }
  resetRouter(); // 清除掉动态加载的路由
  intoRecurse(userPermission, (item, options) => { // 获取首页
    if (item.redirect) {
      indexPage.path = item.redirect;
      options.close = true;
    } else {
      if (item.meta && item.meta.type == 3) { // 找到第一个菜单
        delete indexPage.path;
        indexPage.name = item.name;
        item.meta.isIndex = true;
        options.close = true;
      }
    }
  });
  intoRecurse(userPermission, item => { // 重新获取 tagViews
    const tag = oldTagViews.find(t => t.name == item.name);
    if (tag && !newTagViews.find(t => t.name == item.name)) {
      newTagViews.push({
        name: tag.name,
        params: tag.params,
        title: item.meta && item.meta.title
      });
    }
  });
  vm.$store.commit('layout/setTagViews', newTagViews); // 重新设置 tagViews
  router.addRoutes([ // 动态添加路由
    ...asyncRouters,
    // 添加首页重定向，必须写在404前面
    { path: '/', redirect: { name: indexPage.name }},
    // 动态加载路由通配符，路由通配符必须写在最下面
    { path: '*', redirect: '/404' }
  ]);
  return {
    indexPage: indexPage.name,
    tags: newTagViews.find(n => n.name == indexPage.name)
  };
}

export function hasChildrenShow(arr) { // 判断侧边栏是否有显示菜单
  for (const val of arr) {
    if (val.meta && val.meta.isShow) {
      if (val.meta.type == 3) {
        return true;
      }
      if (val.meta.type == 2 && val.children && val.children.length) {
        const flag = hasChildrenShow(val.children);
        if (flag) {
          return flag;
        }
      }
    }
  }
  return false;
}
